package top.truism.leetcode;

/**
 * 「句子」是一个用空格分隔单词的字符串。给你一个满足下述格式的句子 text :
 * <p>
 * 句子的首字母大写
 * text 中的每个单词都用单个空格分隔。
 * 请你重新排列 text 中的单词，使所有单词按其长度的升序排列。如果两个单词的长度相同，则保留其在原句子中的相对顺序。
 * <p>
 * 请同样按上述格式返回新的句子。
 */
public class LeetCode1451 {

    private static final String SPACE = " ";

    public String arrangeWords(String text) {
        String[] stringArray = text.split(SPACE);
        // 首个单词首字母转小写
        stringArray[0] = firstCharToLower(stringArray[0]);
        // 对字符串数组排序
        sort(stringArray);
        stringArray[0] = firstCharToUpper(stringArray[0]);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < stringArray.length; i++) {
            sb.append(stringArray[i]);
            if (i != stringArray.length - 1) {
                sb.append(SPACE);
            }
        }
        return sb.toString();
    }

    /**
     * 对字符串数组进行排序，长度相同的不改变相对顺序，使用冒泡排序
     *
     * @param strings
     * @return
     */
    private void sort(String[] strings) {
        //
        for (int i = 0; i < strings.length; i++) {
            for (int j = 0; j < strings.length - i - 1; j++) {
                if (strings[j].length() > strings[j + 1].length()) {
                    String temp = strings[j];
                    strings[j] = strings[j + 1];
                    strings[j + 1] = temp;
                }
            }
        }
    }

    /**
     * 单词首字母转大写
     *
     * @param word
     * @return
     */
    private String firstCharToUpper(String word) {
        char[] chars = word.toCharArray();
        chars[0] = (char) (chars[0] - 32);
        return new String(chars);
    }

    /**
     * 单词首字母转小写
     *
     * @param word
     * @return
     */
    private String firstCharToLower(String word) {
        char[] chars = word.toCharArray();
        chars[0] = (char) (chars[0] + 32);
        return new String(chars);
    }

}
